package com.ggh.entity;
import com.ggh.handler.RobBanker_TimeP;
import com.ggh.handler.RobBanker_TimePSiRen;
import lombok.Data;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import java.util.*;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**

 * @author ： jj
 * @date ：2019/10/10 14:35
 * @description : 牌九房间类
 * 总类
 * @path : RoomBeanP.java.RoomBeanP
 * @modifiedBy ：
 */
@Data
public class RoomBeanP {
	/**
	 * 房间号
 	 */
	private String roomno;
	/**
	 * 游戏类型：
	 * 0百人大牌九
	 * 1百人小牌九
	 * 四人牌九（
	 * 3,50锅
	 * 4，100锅
	 * 5，两张50,
	 * 6两张100，
	 * 7两张200）
	 */
	private int game_type;
	/**
	 * 房间费用（房卡）（例如：50真实费用）
 	 */
	private int money;
	/**
	 * 总牌信息
	 */
	private List<Integer> brands;
	/**
	 * 房间人数*
	 */
	private int number;
	/**
	 * 房间最大人数
	 */
	private int max_number;
	/**
	 * 分
	 */
	private int fen;
	/**
	 * 输赢记录
	 */
	private List winRecord;

	//百人牌九四个牌位--------------
	/**
	 * 庄
	 */
	private  List<Integer>  zpai;
	/**
	 * 初
	 */
	private  List<Integer>  cpai;
	/**
	 * 天
	 */
	private  List<Integer>  tpai;
	/**
	 * 末
	 */
	private  List<Integer>  mpai;


	//时间------------------------------

	/**
	 * 准备
	 */
	private int time01;
	/**
	 * 抢庄
	 */
	private int time02;
	/**
	 *  下注
	 */
	private int time03;
	/**
	 * 组牌
	 */
	private int time04;
	// 相关信息-------------------
	/**
	 * 筛子数
	 */
	private int[] saizhi;
	/**
	 * 玩家集合
	 */
	private List<UserBean> game_userlist;
	/**
	 * 请求上庄的信息
	 */
	private List<Integer> upbanker;
	/**
	 * 房间操作记录
	 */
	private List<Map<String, Object>> user_log;
	/**
	 * 当前庄家id:
	 * 默认0
	 */
	private int banker;
	/**
	 * 当前下注限制
	 */
	private String betLimit;
	/**
	 * 当前局数
	 */
	private int game_number;

	/**
	 * 用户座位位置从0开始，值代表用户id（4-8个位置）
	 */
	private int[] user_positions;
	/**
	 * 房间状态
	 * 0、等待加入
	 * 1、准备阶段(2人准备，开启倒计时)
	 * 游戏不同使用的状态不同
	 */
	private int state;
	/**
	 * 房间解散状态
	 * 0：未发起
	 * 1：发起
	 * 2：解散
	 * 3：失败
	 */
	private int exit_game;
	/**
	 * 不痛杀0
	 * 通杀1
	 */
	private int hint;
	/**
	 *  房间锁
	 */
	private Lock lock;

	//--------------百人牌九房间类----------------------
	/**
	 * 金币池
	 */
	private float zMoney;
	/**
	 * 可下注
	 */
	private int kMoney;
	/**
	 * 初
	 */
	private int chuMoney;
	/**
	 * 天
	 */
	private int tianMoney;
	/**
	* 末
	*/
	private int moMoney;
	//--------百人那张桌子输赢0输1赢---------
	/**
	 * 初
	 */
	private int chuWin;
	/**
	 *  天
	 */
	private int tianWin;
	/**
	 * 末
	 */
	private int moWin;
	//-----单张桌子下注集合---------
	/**
	 * 初
	 *
	 */
	private List<Integer> cuserListMoney;
	/**
	 天*/
	private List<Integer> tuserListMoney;
	/**
	 * 末
	 */
	private List<Integer> muserListMoney;
	/**
	 *  倒计时时间（线程）
	 */
	private int time;
	/**
	 * 当前下注信息
	 */
	private List<Integer> bInfoRoom;
	/**
	 * 四人牌九主线程
	 */
	RobBanker_TimePSiRen time1;
	/**
	 * 百人牌九主线程
	 */
	RobBanker_TimeP time2;



	/**
	* @description :无参构造
	* @return: null
	* @date : 2019/10/10 14:45
	* @author : jj
	* @throws
	*/
	public RoomBeanP() {
		// 房间类型（0普通房间）
		this.game_type = 0;
		// 初始化用户座位
		this.seat();
		// 房间的牌
		this.brands = new ArrayList<Integer>();
		// 初始化牌的信息
		this.Init_Brands();
		// 房间锁
		this.lock = new ReentrantLock(true);
		// 玩家集合
		this.game_userlist = new ArrayList<UserBean>();
		// 房间操作记录（日志，暂不用）
		this.user_log = new ArrayList<Map<String, Object>>();
		// 房间状态0等待加入1准备阶段
		this.state = 0;
		// 庄家
		banker = 0;
		upbanker = new ArrayList<Integer>();
		//-------------百人牌九-----------------
		/*每个桌子牌*/
		zpai=new ArrayList<Integer> ();
		cpai=new ArrayList<Integer> ();
		tpai=new ArrayList<Integer> ();
		mpai=new ArrayList<Integer> ();
		/*每张桌子下注金额*/
		chuMoney=0;
		tianMoney=0;
		moMoney=0;
		//每个桌子下注金币
		cuserListMoney=new ArrayList<Integer> ();
		tuserListMoney=new ArrayList<Integer> ();
		muserListMoney= new ArrayList<Integer> ();

	}


	/**
	 * 房间信息初始化
	 */
	public void Initialization() {
		// 初始化牌信息
		Init_Brands();
		// 初始化用户
		for (UserBean user : game_userlist) {
			user.Initialization();
		}
		// 操作日志
		this.user_log.clear();
		// 房间状态0等待加入1准备阶段2
		this.state = 0;
		// 游客
		//banker = 0;
		//upbanker.clear();
		// 解散
		exit_game = 0;
		saizhi=null;
		//--------------百人操作---------------
		kMoney=(int) zMoney;
		cuserListMoney.clear();
		cuserListMoney.clear();
		muserListMoney.clear();
		zpai.clear();
		cpai.clear();
		tpai.clear();
		mpai.clear();
		chuMoney=0;
		tianMoney=0;
		moMoney=0;
		chuWin=0;
		tianWin=0;
		moWin=0;

	}

	/**
	* @description :抢庄倒计时方法
	* @return: void
	* @date : 2019/10/10 15:22
	* @author : jj
	* @throws
	*/
	public void time1() {
		time1 = new RobBanker_TimePSiRen(this);
		time1.start();
	}

	/**
	* @description :抢庄倒计时方法(百人)
	* @return: void
	* @date : 2019/10/10 15:22
	* @author : jj
	* @throws
	*/
	public void time2() {
		time2 = new RobBanker_TimeP(this);
		time2.start();
	}


	/**
	* @description :初始化座位信息
	* @return: void
	* @date : 2019/10/10 15:23
	* @author : jj
	* @throws
	*/
	public void seat() {
		/* 根据房间类型 初始化房间信息*/
		if (max_number==-1){
			max_number=299;
		}

		this.user_positions = new int[max_number];

		for (int i = 0; i < max_number; i++) {
			user_positions[i] = -1;
		}
	}

	/**
	 * 初始化一副牌
	 */
	private void Init_Brands() {
		brands.clear();
		int[] pai = { 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 12, 13, 14, 15, 16, 17,
				18, 19, 20 };
		for (int i = 0; i < pai.length; i++) {
			brands.add(Integer.valueOf(pai[i]));
		}
	}
	/**
	* @description :百人发牌
	* @return: void
	* @date : 2019/10/6 9:26
	* @author : jj
	* @throws
	*/
	public void dealBranch() {
		// 初始化一副牌
		Init_Brands();
		/**
		 * 判断是否有庄家
		if (banker==0){
			return;
		}*/
		/**
		 * 判断牌得类型
		 * 0大牌九
		 * 1小牌九
		 */
		int m=0;
		if (this.game_type==1){
			m=2;
		}else if (this.game_type==0){
			m=4;
		}
		/**
		 * 根据游戏类型发牌
		 */
		for (int j = 0; j < m; j++) {
			int size = brands.size();
			// 产生随机数，获取牌的信息
			int random = (int) (Math.random() * size);
			// 牌，存入用户信息中
			int index = brands.get(random);
			zpai.add(Integer.valueOf(index));

			brands.remove(random);
		}
		/**
		 * 根据游戏类型发牌
		 */
		for (int j = 0; j < m; j++) {
			int size = brands.size();
			// 产生随机数，获取牌的信息
			int random = (int) (Math.random() * size);
			// 牌，存入用户信息中
			int index = brands.get(random);
			tpai.add(Integer.valueOf(index));
			brands.remove(random);
		}
		for (int j = 0; j < m; j++) {
			int size = brands.size();
			// 产生随机数，获取牌的信息
			int random = (int) (Math.random() * size);
			// 牌，存入用户信息中
			int index = brands.get(random);
			cpai.add(Integer.valueOf(index));
			brands.remove(random);
		}
		for (int j = 0; j < m; j++) {
			int size = brands.size();
			// 产生随机数，获取牌的信息
			int random = (int) (Math.random() * size);
			// 牌，存入用户信息中
			int index = brands.get(random);
			mpai.add(Integer.valueOf(index));
			brands.remove(random);
		}
		/**
		 * 给各个桌下注最多的用户标识可组牌
		 */
		List<UserBean> userList =getGame_userlist();
		int cMoney=0;
		int cUserId=0;
		int tMoney=0;
		int tUserId=0;
		int mMoney=0;
		int mUserId=0;
		/**
		 * 判断谁下注多大
		 */
		for (UserBean user:userList) {
			if (user.getChu()>0){
				if (user.getChu()>cMoney){
					cMoney=user.getChu();
					cUserId=user.getUserid();
				}
			}

			if (user.getTian()>0){
				if (user.getTian()>tMoney){
					tMoney=user.getTian();
					tUserId=user.getUserid();
				}
			}
			if (user.getMo()>0){
				if (user.getMo()>mMoney){
					mMoney=user.getMo();
					mUserId=user.getUserid();
				}
			}
		}
		/**
		 * 添加标识
		 */
		if (cMoney>0){
			if (cUserId>0){
				UserBean userBean = getUserBean(cUserId);
				userBean.setIsbrand(1);
			}
		}
		if (tMoney>0){
			if (tUserId>0){
				UserBean userBean = getUserBean(tUserId);
				userBean.setIsbrand(2);
			}
		}
		if (mMoney>0){
			if (mUserId>0){
				UserBean userBean = getUserBean(mUserId);
				userBean.setIsbrand(3);
			}
		}
		System.out.println("---------");
	}

	/**
	 * 发牌
	 */
	public void deal() {
		// 给在座位上的所有用户
		Init_Brands();// 初始化一副牌
		for (int i = 0; i < user_positions.length; i++) {
			if (user_positions[i] == -1) {
				continue;
			}
			// 获取用户信息
			UserBean u = getUserBean(user_positions[i]);
			// 根据游戏类型发牌
			List<Integer> list = new ArrayList<Integer>();
			for (int j = 0; j < 4; j++) {
				int size = brands.size();
				// 产生随机数，获取牌的信息
				int random = (int) (Math.random() * size);
				// 牌，存入用户信息中
				int index = brands.get(random);
				list.add(Integer.valueOf(index));
				brands.remove(random);
			}
			u.setBrands(list);
			System.out.println("---------");
		}
	}
	/**
	* @description :根据胜率判断发牌区间
	* @date : 2019/10/30 9:40
	* @author : jj
	*/
	private int accordToWingRg(){

		return 0;
	}

	/**
	 * 发牌2张
	 */
	public void dealTwo() {
		// 给在座位上的所有用户
		Init_Brands();// 初始化一副牌
		for (int i = 0; i < user_positions.length; i++) {
			if (user_positions[i] == -1) {
				continue;
			}
			// 获取用户信息
			UserBean u = getUserBean(user_positions[i]);
			// 根据游戏类型发牌
			List<Integer> list = new ArrayList<Integer>();
			for (int j = 0; j < 2; j++) {
				int size = brands.size();
				// 产生随机数，获取牌的信息
				int random = (int) (Math.random() * size);
				// 牌，存入用户信息中
				int index = brands.get(random);
				list.add(Integer.valueOf(index));
				brands.remove(random);
			}
			u.setBrands(list);
			System.out.println("---------");
		}
	}


	/**
	 * 删除指定的一张牌(牌id)
	 * 
	 * @param brand_index
	 */
	public void Remove_Brands(int brand_index) {
		for (int i = 0; i < this.brands.size(); i++) {
			if (this.brands.get(i) == brand_index) {
				this.brands.remove(i);
				break;
			}
		}
	}
	/**
	 * 删除一名用户
	 * 
	 * @param userid
	 */
	public void User_Remove(int userid) {
		for (int i = 0; i < game_userlist.size(); i++) {
			if (game_userlist.get(i).getUserid() == userid) {
				game_userlist.remove(i);
				break;
			}
		}
	}

	/***
	 * 获取指定id的用户实例
	 * 
	 * @param userid
	 * @return
	 */
	public UserBean getUserBean(int userid) {
		for (UserBean userBean : game_userlist) {
			if (userBean.getUserid() == userid) {
				return userBean;
			}
		}
		return null;
	}


	/**
	 * 添加操作日志
	 * 
	 * @param logMap
	 */
	public void addLog(Map<String, Object> logMap) {
		Map<String, Object> map = new HashMap<String, Object>();
		for (String key : logMap.keySet()) {
			map.put(key, logMap.get(key));
		}
		this.user_log.add(map);
	}

	// 初始化所有用户输赢状态
	public void HuState_InIt() {
		for (UserBean userBean : this.game_userlist) {
			userBean.setHu_state(0);
		}
	}



	public static void main(String[] args) {
		RoomBeanP a=new RoomBeanP();
		a.dealBranch();
		System.out.println(a.toString());
	}
}